<!DOCTYPE html>



  


<html class="theme-next muse use-motion" lang="zh-Hans">
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css">







<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css">

<link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css">


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="Hexo, NexT">





  <link rel="alternate" href="/atom.xml" title="renhao" type="application/atom+xml">






<meta name="description" content="《Node.js开发指南》BYVoid编著">
<meta property="og:type" content="article">
<meta property="og:title" content="【读书笔记】Node_Foundation">
<meta property="og:url" content="https://huangrenhao.gitee.io/2018/12/14/read-node.jsday1/index.html">
<meta property="og:site_name" content="renhao">
<meta property="og:description" content="《Node.js开发指南》BYVoid编著">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="http://www.runoob.com/wp-content/uploads/2015/09/event_loop.jpg">
<meta property="og:updated_time" content="2020-10-10T00:42:24.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="【读书笔记】Node_Foundation">
<meta name="twitter:description" content="《Node.js开发指南》BYVoid编著">
<meta name="twitter:image" content="http://www.runoob.com/wp-content/uploads/2015/09/event_loop.jpg">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Muse',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="https://huangrenhao.gitee.io/2018/12/14/read-node.jsday1/">





  <title>【读书笔记】Node_Foundation | renhao</title>
  








<link rel="stylesheet" href="/css/prism-tomorrow.css" type="text/css"></head>

<body itemscope="" itemtype="http://schema.org/WebPage" lang="zh-Hans">
  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope="" itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">renhao</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br>
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br>
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br>
            
            归档
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope="" itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="https://huangrenhao.gitee.io/2018/12/14/read-node.jsday1/">

    <span hidden itemprop="author" itemscope="" itemtype="http://schema.org/Person">
      <meta itemprop="name" content="renhao">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope="" itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="renhao">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">【读书笔记】Node_Foundation</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2018-12-14T19:11:10+08:00">
                2018-12-14
              </time>
            

            

            
          </span>

          
            <span class="post-category">
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope="" itemtype="http://schema.org/Thing">
                  <a href="/categories/读书笔记/" itemprop="url" rel="index">
                    <span itemprop="name">读书笔记</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <span class="post-meta-item-icon">
                  <i class="fa fa-comment-o"></i>
                </span>
                <a href="/2018/12/14/read-node.jsday1/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count valine-comment-count" data-xid="/2018/12/14/read-node.jsday1/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          
          

          

          
            <div class="post-wordcount">
              
                
                <span class="post-meta-item-icon">
                  <i class="fa fa-file-word-o"></i>
                </span>
                
                  <span class="post-meta-item-text">字数统计&#58;</span>
                
                <span title="字数统计">
                  3.6k
                </span>
              

              
                <span class="post-meta-divider">|</span>
              

              
                <span class="post-meta-item-icon">
                  <i class="fa fa-clock-o"></i>
                </span>
                
                  <span class="post-meta-item-text">阅读时长 &asymp;</span>
                
                <span title="阅读时长">
                  12
                </span>
              
            </div>
          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <blockquote>
<p>《Node.js开发指南》BYVoid编著<a id="more"></a></p>
</blockquote>
<h3 id="是什么？"><a href="#是什么？" class="headerlink" title="是什么？"></a>是什么？</h3><p>Node.js不是<del>一种独立语言、一个JavaScript框、浏览器端的库</del>，而是一个可以让JavaScript运行在服务端的平台，让JavaScript脱离浏览器的束缚运行在一般的服务器环境下。</p>
<h3 id="目的-能做什么？"><a href="#目的-能做什么？" class="headerlink" title="目的 能做什么？"></a>目的 能做什么？</h3><p>一开始是为实时Web（Real-time Web）应用开发而诞生的平台，充分考虑在实时响应、超大规模数据要求下架构的可扩展性，采用了<strong>单线程、异步式I/O、事件驱动式</strong>的程序设计模型（不是依靠<del>多线程实现高并发</del>的设计思路）</p>
<blockquote>
<p>高性能 web 服务器需要满足：事件驱动、非阻塞I/O</p>
</blockquote>
<p>能做什么：可以作为服务器向用户提供服务，内建了HTTP服务器支持，跳过了Apache、Nginx等HTTP服务器，直接面向前端开发。具体的参见下表：</p>
<blockquote>
<p>小技巧： 使用supervisor可以实现在后台编程时类似热更新的功能，可以不用每次都手动终止进程并重启来实现后台代码更新后的结果。</p>
</blockquote>
<h3 id="最大特点：异步式I-O与事件驱动"><a href="#最大特点：异步式I-O与事件驱动" class="headerlink" title="最大特点：异步式I/O与事件驱动"></a>最大特点：异步式I/O与事件驱动</h3><p>对于高并发的解决方案：</p>
<ul>
<li><p>传统架构：多线程模型，为每个业务逻辑提供一个系统线程，通过系统线程切换来弥补同步式I/O调用时的时间开销。</p>
</li>
<li><p>Node.js：单线程，对于所有I/O都采用异步式的请求方式，避免了频繁的上下文切换，在执行过程中维护一个事件队列，程序在执行时进入时间循环等待下一个事件到来，每个异步式I/O请求完成后会被推送到事件队列，等待程序进程进行处理。</p>
<p>Node.js的<strong>异步机制基于事件</strong>，所有的磁盘I/O、网络通信、数据库查询、客户端请求都以<strong>非阻塞</strong>的方式请求，返回的结果由<strong>事件循环</strong>来处理。这么做的好处：CPU和内存在同一时间集中处理一件事，同时尽可能让耗时的I/O操作并行执行，只是在事件队列中增加请求然后等待操作系统的回应，所以不会有任何多线程开销，防止恶意攻击。</p>
<p>i.e. 数据库查询操作：</p>
<ul>
<li><p>传统方式：</p>
<p><code>res = db.query(&#39;SELECT * from some_table&#39;);res.output();
res = db.query(&#39;SELECT * from some_table&#39;);
res.output();</code></p>
<p>代码执行到第一行的时候，线程会阻塞，等待数据库返回查询结果，然后在继续处理。（由于数据库查询可能涉及磁盘读写和网络通信，其延时可能相当大，线程会在这里阻塞等待结果返回）</p>
<p>传统方式<strong>缺点</strong>：对于高并发的访问</p>
<ul>
<li>线程长期阻塞等待–&gt;浪费大量系统资源</li>
<li>为了应付新请求而不断增加线程–&gt;占用大量的CPU时间来处理内存上下文切换，容易遭受低速连接攻击。</li>
</ul>
</li>
<li><p>Node.js：</p>
<pre><code>db.query(&#39;SELECT * from some_table&#39;,function(res) { res.output();
});
</code></pre><p><code>db.query</code>的第二个参数是一个<strong>回调函数</strong>。进程执行到<code>db.query</code>的时候不会等待结果返回，而是继续执行后面的语句，直到进入事件循环。当数据库查询结果返回时会将事件发送到事件队列，等到线程进入事件循环以后，才会调用之前的回调函数继续执行后面的逻辑。</p>
</li>
</ul>
</li>
</ul>
<h5 id="中间一些需要了解的概念："><a href="#中间一些需要了解的概念：" class="headerlink" title="中间一些需要了解的概念："></a>中间一些需要了解的概念：</h5><ul>
<li>阻塞：阻塞是指线程在执行过程中遇到I/O操作（磁盘读写或者网络通信等耗费较长时间的操作），操作系统会剥夺这个线程的CPU控制权，让它暂停执行，同时将资源让给其他的工作线程。当I/O操作完成之后操作系统再将这个线程的阻塞状态解除，恢复其对CPU的控制权，令其继续执行。这种模式也称为同步式I/O或阻塞式I/O。</li>
</ul>
<h3 id="node-js应用组成部分"><a href="#node-js应用组成部分" class="headerlink" title="node.js应用组成部分"></a>node.js应用组成部分</h3><ol>
<li><strong>引入 required 模块：</strong>我们可以使用 <strong>require</strong> 指令来载入 Node.js 模块。</li>
<li><strong>创建服务器：</strong>服务器可以监听客户端的请求，类似于 Apache 、Nginx 等 HTTP 服务器。</li>
<li><strong>接收请求与响应请求</strong> 服务器很容易创建，客户端可以使用浏览器或终端发送 HTTP 请求，服务器接收请求后返回响应数据。</li>
</ol>
<h3 id="npm-使用"><a href="#npm-使用" class="headerlink" title="npm 使用"></a>npm 使用</h3><h4 id="功能"><a href="#功能" class="headerlink" title="功能"></a>功能</h4><ul>
<li>允许用户从NPM服务器下载别人编写的第三方包到本地使用。</li>
<li>允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。</li>
<li>允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。</li>
</ul>
<h4 id="安装模块"><a href="#安装模块" class="headerlink" title="安装模块"></a>安装模块</h4><ul>
<li><p>本地安装 </p>
<p>以express为例，命令<code>npm install express</code></p>
<ul>
<li>安装包将放在 ./node_modules 下（运行 npm 命令时所在的目录），如果没有 node_modules 目录，会在当前执行 npm 命令的目录下生成 node_modules 目录。</li>
<li>可以通过 require() 来引入本地安装的包。</li>
</ul>
</li>
<li><p>全局安装</p>
<p>命令<code>npm install express -g</code></p>
<ul>
<li>安装包将放在 /usr/local 下或者node 的安装目录。</li>
<li>可以直接在命令行里使用。</li>
</ul>
</li>
</ul>
<p>此外，npm 还可以进行卸载、更新、搜索、创建模块。</p>
<h3 id="回调函数和事件循环"><a href="#回调函数和事件循环" class="headerlink" title="回调函数和事件循环"></a>回调函数和事件循环</h3><p>Node.js几乎每个API都支持回调函数，回调函数在任务完成之后就会被调用。一个简单的例子就是一边读取文件一边执行其他的命令，在文件读取完成之后将文件内容作为回调函数的参数返回。这样做在执行代码的时候没有阻塞（就是没有等待文件读取的I/O操作完成之后再去执行接下来的代码，节省了等待文件读取的时间），可以处理并发的请求。</p>
<blockquote>
<p><a href="http://www.runoob.com/design-pattern/observer-pattern.html" target="_blank" rel="noopener">观察者模式</a>：</p>
<ul>
<li><strong>意图：</strong>定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。</li>
<li><strong>主要解决：</strong>一个对象状态改变给其他对象通知的问题，而且要考虑到易用和低耦合，保证高度的协作。</li>
<li><strong>何时使用：</strong>一个对象（目标对象）的状态发生改变，所有的依赖对象（观察者对象）都将得到通知，进行广播通知。</li>
<li><strong>如何解决：</strong>使用面向对象技术，可以将这种依赖关系弱化。</li>
<li><strong>关键代码：</strong>在抽象类里有一个 ArrayList 存放观察者们。</li>
<li><strong>应用实例：</strong> 1、拍卖的时候，拍卖师观察最高标价，然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿，菩萨洒了一地水招来一个老乌龟，这个乌龟就是观察者，他观察菩萨洒水这个动作。</li>
<li><strong>优点：</strong> 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。</li>
<li><strong>缺点：</strong> 1、如果一个被观察者对象有很多的直接和间接的观察者的话，将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话，观察目标会触发它们之间进行循环调用，可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的，而仅仅只是知道观察目标发生了变化。</li>
<li><strong>使用场景：</strong></li>
<li>一个抽象模型有两个方面，其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。</li>
<li>一个对象的改变将导致其他一个或多个对象也发生改变，而不知道具体有多少对象将发生改变，可以降低对象之间的耦合度。</li>
<li>一个对象必须通知其他对象，而并不知道这些对象是谁。</li>
<li>需要在系统中创建一个触发链，A对象的行为将影响B对象，B对象的行为将影响C对象……，可以使用观察者模式创建一种链式触发机制。</li>
</ul>
</blockquote>
<p>Node.js基本上所有的事件机制都是设计模式中的观察者模式实现。Node.js的单线程类似一个while(true)事件循环，直到没有事件观察者退出，每个异步事件都生成一个事件观察者，如果有事件发生就调用该回调函数。</p>
<h4 id="事件驱动程序流程"><a href="#事件驱动程序流程" class="headerlink" title="事件驱动程序流程"></a>事件驱动程序流程</h4><p><img src="http://www.runoob.com/wp-content/uploads/2015/09/event_loop.jpg" alt="流程图"></p>
<p>核心思想：当web server接受到请求，就把它关闭然后进行处理，然后去服务下一个web请求。当这个请求完成，它被放回处理队列，当到达队列开头，这个结果被返回给用户。在事件驱动模型中，会生成一个主循环来监听事件，当检测到事件的时候触发回调函数。</p>
<p>Node.js中所有的异步I/O操作在完成时都会发送一个事件到事件队列。</p>
<p>EventEmitters：核心就是事件触发与事件监听器的封装。EventEmitters是events模块中的一个对象，实例化之后就可以使用，添加事件监听器或者触发事件等。</p>
<h3 id="缓冲区"><a href="#缓冲区" class="headerlink" title="缓冲区"></a>缓冲区</h3><p>缓存区是用于创建一个专门存放二进制数据，因为处理TCP流或者文件流时必须用到二进制数据而JavaScript中只有字符串数据没有二进制数据类型。提供一些API可以将字符串写入缓冲区或者从缓冲区中读取数据，也可以将Buffer转化为JSON对象，缓冲区还可以进行拷贝、裁剪、比较、合并。</p>
<h3 id="流Stream"><a href="#流Stream" class="headerlink" title="流Stream"></a>流Stream</h3><p>流主要进行的是文件的一些操作。</p>
<ul>
<li>可以从文件创建可读流然后从流中读取文件的内容</li>
<li>可以创建写入流将数据写入文件</li>
<li>管道流就是提供了一个输出流到输入流的机制，可以通过读取一个文件内容并将内容写入到另外一个文件中</li>
<li>链式流一般用于管道操作，链式通过连接输出流到另外一个流并创建多个流操作链，可以综合链式和管道压缩和解压文件</li>
</ul>
<h3 id="模块系统、全局对象、常用工具"><a href="#模块系统、全局对象、常用工具" class="headerlink" title="模块系统、全局对象、常用工具"></a>模块系统、全局对象、常用工具</h3><p>模块系统的时候再前端模块化的时候有涉及，Node.js是CommonJs规范的主要实践者。</p>
<p>全局对象即可以在程序中的任何地方访问它及其所有属性，与JavaScript中通常的全局变量window不一样，Node.js中的全局变量是global。这里列举比较有用的两个：</p>
<ul>
<li><code>__filename</code> 表示当前正在执行的脚本的文件名，它将输出文件所在位置的绝对路径，且和命令行参数所指定的文件名不一定相同。 如果在模块中，返回的值是模块文件的路径。</li>
<li><code>__dirname</code> 表示当前执行脚本所在的目录。</li>
</ul>
<p>常用工具就是<code>util</code>，是一个Node.js核心模块，提供常用函数的集合。</p>
<ul>
<li><code>util.inherits</code>，实现对象间原型继承的函数，JavaScript中面向对象的特性是基于原型的，没有提供对象继承的语言级别特性，而是通过原型赋值来实现。</li>
<li><code>util.inspect</code>是一个将任意对象转换为字符串的方法，常用于调试。</li>
<li><code>util.isArray</code>,<code>util.isRegExp</code>,<code>utilisDate</code>,<code>util.isError</code>分别用于判断给定参数是不是一个数组、正则表达式、日期、错误对象等。</li>
</ul>
<h3 id="文件系统"><a href="#文件系统" class="headerlink" title="文件系统"></a>文件系统</h3><p>文件系统模块<code>fs</code>，模块中的方法都有异步和同步版本，一般情况下异步方法性能更高、速度更快、没有阻塞，优先使用异步方法。主要使用的方法有打开文件<code>fs.open()</code>、获取文件信息<code>fs.stat()</code>，还有写入、读取、关闭、截取、删除文件，还有创建、读取、删除目录等目录操作。</p>
<h3 id="GET-POST请求"><a href="#GET-POST请求" class="headerlink" title="GET/POST请求"></a>GET/POST请求</h3><p>表单提交到服务器一般都使用GET/POST请求。</p>
<ul>
<li>GET请求直接被嵌套入路径中，URL是完整的请求路径，采用的方式是手动解析URL后面的部分内容作为GET请求的参数（使用 <code>url.parse</code> 方法，<code>url.parse()</code>方法用于解析URL对象，解析后返回一个JSON对象。）</li>
<li>POST请求的内容在请求体中，默认不会解析请求体，需要的时候手动解析，采用的方式是通过request的data时间监听函数，每当接收到请求体的数据就将其添加到变量中。</li>
</ul>
<h3 id="路由"><a href="#路由" class="headerlink" title="路由"></a>路由</h3><p>路由简单的说就是决定了由谁(指定脚本)去响应客户端请求，其中依据的对象或者说做出判断的对象就是请求的URL或者其他需要的GET及POST参数。</p>
<h3 id="Express-框架"><a href="#Express-框架" class="headerlink" title="Express 框架"></a>Express 框架</h3><p>简洁而灵活的web应用框架，简化了前面涉及的一系列操作，主要包括请求响应、路由、GET/POST方法等，提供了一个中间件来设置静态文件，可以通过URL+静态文件路径来加载文件，还有文件上传操作、cookie管理。</p>
<h3 id="多进程"><a href="#多进程" class="headerlink" title="多进程"></a>多进程</h3><p>Node 提供了 child_process 模块来创建子进程，方法有：</p>
<ul>
<li><strong>exec</strong> - child_process.exec 使用子进程执行命令，缓存子进程的输出，并将子进程的输出以回调函数参数的形式返回。</li>
<li><strong>spawn</strong> - child_process.spawn 使用指定的命令行参数创建新进程。</li>
<li><strong>fork</strong> - child_process.fork 是 spawn()的特殊形式，用于在子进程中运行的模块，如 fork(‘./son.js’) 相当于 spawn(‘node’, [‘./son.js’]) 。与spawn方法不同的是，fork会在父进程与子进程之间，建立一个通信管道，用于进程之间的通信。</li>
</ul>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2018/12/11/webgl-partfour/" rel="next" title="【教程学习】WebGL中的三维部分">
                <i class="fa fa-chevron-left"></i> 【教程学习】WebGL中的三维部分
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2018/12/20/thesis-undergraduate/" rel="prev" title="related work for graduation thesis of undergraduate">
                related work for graduation thesis of undergraduate <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  
    <div class="comments" id="comments">
    </div>
  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
            
              <p class="site-author-name" itemprop="name">renhao</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/archives/">
              
                  <span class="site-state-item-count">94</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                <a href="/categories/index.html">
                  <span class="site-state-item-count">19</span>
                  <span class="site-state-item-name">分类</span>
                </a>
              </div>
            

            

          </nav>

          
            <div class="feed-link motion-element">
              <a href="/atom.xml" rel="alternate">
                <i class="fa fa-rss"></i>
                RSS
              </a>
            </div>
          

          

          
          

          
          

          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#是什么？"><span class="nav-number">1.</span> <span class="nav-text">是什么？</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#目的-能做什么？"><span class="nav-number">2.</span> <span class="nav-text">目的 能做什么？</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#最大特点：异步式I-O与事件驱动"><span class="nav-number">3.</span> <span class="nav-text">最大特点：异步式I/O与事件驱动</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#中间一些需要了解的概念："><span class="nav-number">3.0.1.</span> <span class="nav-text">中间一些需要了解的概念：</span></a></li></ol></li></ol><li class="nav-item nav-level-3"><a class="nav-link" href="#node-js应用组成部分"><span class="nav-number">4.</span> <span class="nav-text">node.js应用组成部分</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#npm-使用"><span class="nav-number">5.</span> <span class="nav-text">npm 使用</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#功能"><span class="nav-number">5.1.</span> <span class="nav-text">功能</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#安装模块"><span class="nav-number">5.2.</span> <span class="nav-text">安装模块</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#回调函数和事件循环"><span class="nav-number">6.</span> <span class="nav-text">回调函数和事件循环</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#事件驱动程序流程"><span class="nav-number">6.1.</span> <span class="nav-text">事件驱动程序流程</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#缓冲区"><span class="nav-number">7.</span> <span class="nav-text">缓冲区</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#流Stream"><span class="nav-number">8.</span> <span class="nav-text">流Stream</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#模块系统、全局对象、常用工具"><span class="nav-number">9.</span> <span class="nav-text">模块系统、全局对象、常用工具</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#文件系统"><span class="nav-number">10.</span> <span class="nav-text">文件系统</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#GET-POST请求"><span class="nav-number">11.</span> <span class="nav-text">GET/POST请求</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#路由"><span class="nav-number">12.</span> <span class="nav-text">路由</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Express-框架"><span class="nav-number">13.</span> <span class="nav-text">Express 框架</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#多进程"><span class="nav-number">14.</span> <span class="nav-text">多进程</span></a></li></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2020</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">renhao</span>

  
    <span class="post-meta-divider">|</span>
    <span class="post-meta-item-icon">
      <i class="fa fa-area-chart"></i>
    </span>
    
      <span class="post-meta-item-text">Site words total count&#58;</span>
    
    <span title="Site words total count">265.9k</span>
  
</div>


  <div class="powered-by">由 <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a> 强力驱动</div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">主题 &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Muse</a> v5.1.4</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script>



  
  

  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  










  <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
  <script src="//unpkg.com/valine/dist/Valine.min.js"></script>
  
  <script type="text/javascript">
    var GUEST = ['nick','mail','link'];
    var guest = 'nick,mail,link';
    guest = guest.split(',').filter(item=>{
      return GUEST.indexOf(item)>-1;
    });
    new Valine({
        el: '#comments' ,
        verify: false,
        notify: false,
        appId: '2P1xqUWiCoNm14MH4yhURlJi-gzGzoHsz',
        appKey: 'uJN0uagHIVgXtBO1OuLV9Ban',
        placeholder: 'Just go go',
        avatar:'mm',
        guest_info:guest,
        pageSize:'10' || 10,
    });
  </script>



  





  

  

  

  
  

  

  

  

</body>
</html>
